package com.zh;

import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine;
import cn.hutool.extra.template.engine.thymeleaf.ThymeleafTemplate;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;

/**
 * @Description: MybatisPlus自动生成代码
 * @ClassName MybatisPlusAutoGenerateCode
 * @date: 2021.01.29 16:59
 * @Author: zhanghang
 *
 * 注意：
 *  1: mybatis-plus-generator 和 mybatis-plus-boot-starter 版本必须一致，否则自动生成代码会失败
 *  2. 需要使用 默认是 velocity-engine-core 模板引擎，也可以使用spring-boot-starter-freemarker 模板引擎
 */
public class MybatisPlusAutoGenerateCode {

    public static void main(String[] args) {
        // 1. 需要构建一个 代码自动生成器 对象
        AutoGenerator autoGenerator = new AutoGenerator();
        // 配置策略
        // 1.1 全局配置
        GlobalConfig gc = new GlobalConfig();
        String property = System.getProperty("user.dir"); // 获取用户目录
        gc.setOutputDir(property+"/springboot-shiro/src/main/java"); // 设置生成文件的目录
        gc.setAuthor("张行"); // 设置作者信息
        gc.setOpen(false); // 设置生成完成之后是否打开windows文件夹，false:不打开
        gc.setFileOverride(false); // 是否覆盖之前生成的
        gc.setServiceName("%sService");// 去除Service 的I 前缀
        gc.setIdType(IdType.ID_WORKER); // 设置主键的生成策略
        gc.setDateType(DateType.ONLY_DATE); // 设置时间的类型
        gc.setSwagger2(true); // 是否生成swagger 文档

        autoGenerator.setGlobalConfig(gc);
        // 2.设置数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://101.201.249.238:3306/springboot-shiro?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf8&rewriteBatchedStatements=true"); // 设置数据源的地址
        dsc.setDriverName("com.mysql.cj.jdbc.Driver"); //设置数据库的连接驱动
        dsc.setUsername("root"); // 设置数据库的用户名
        dsc.setPassword("123456"); // 设置数据库的密码
        dsc.setDbType(DbType.MYSQL);// 设置数据库的类型
        autoGenerator.setDataSource(dsc);

        // 3. 生成包的设置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("user"); // 设置模块的名称
        pc.setParent("com.zh"); // 生成的文件放在哪个包下
        pc.setEntity("entity"); // 生成实体包的名称
        pc.setMapper("mapper"); // 生成实mapper的包的名称
        pc.setService("service"); // 生成service的包的名称
        pc.setController("controller"); // 生成scontroller的包的名称

        autoGenerator.setPackageInfo(pc);
        // 4.策略配置
        StrategyConfig sc = new StrategyConfig();
        sc.setInclude("sys_role_permission"); // 设置腰映射的表明
        // 设置表名的命名规则，underline_to_camel表示使用驼峰命名
        sc.setNaming(NamingStrategy.underline_to_camel);
        // 设置列的命名规则，underline_to_camel表示使用驼峰命名
        sc.setColumnNaming(NamingStrategy.underline_to_camel);
//        sc.setSuperEntityClass("你自己的父类实体，没有就不用设置");
        sc.setEntityLombokModel(true); // 设置是否使用lombok 开始注解
        sc.setLogicDeleteFieldName("is_delete"); // 设置逻辑删除的名字
        sc.setRestControllerStyle(true); // 设置restFul 的驼峰命名
        // 设置自动填充的配置
        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(createTime);
        tableFills.add(updateTime);
        sc.setTableFillList(tableFills);
        // 乐观锁配置
        sc.setVersionFieldName("version"); // 设置乐观锁的字段名
        autoGenerator.setStrategy(sc);

//        autoGenerator.setTemplateEngine(new ThymeleafTemplate());
        // 5 执行
        autoGenerator.execute(); // 执行
    }
}
